﻿// Copyright (c) 2012 - 2020 Jared Zheng <jaredz at outlook dot com>
// Buddha Framework is licensed under Mulan PSL v2.
// You can use this software according to the terms and conditions of the Mulan PSL v2.
// You may obtain a copy of Mulan PSL v2 at:
//          http://license.coscl.org.cn/MulanPSL2
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
// EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
// MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
// See the Mulan PSL v2 for more details.
//
// Create : 2012-12-01 version 0.1 Jared Zheng <jaredz at outlook dot com>
// Update : 2018-12-05 version 3.1.5 Jared Zheng <jaredz at outlook dot com>

#ifndef __AUTHOR_PACKET_H__
#define __AUTHOR_PACKET_H__

#pragma once

#include "commonpacket.h"

/////////////////////////////////////////////////////////////////////////////////////////////////////////
// 授权信令定义
// USRVID是内部服务器之间填写ID预留的字段, 如果没有特殊情况, 不要使用USRVID来附带参数
// 返回外网端时, UACK带有请求处理是否成功标志, ERRORD_OKAY表示成功, 其他数值由环境决定
enum PAK_EVENT_AUTHOR
{
    // 维护时间, 保留事件, 不可使用
    PAKE_AUTHOR_MAINTAIN = PAKE_AUTHOR_BEGIN,  // CPAKMaintain
    // 登入, 保留事件,
    // 1. [PAKE_AUTHOR_BOND] 外网端的交互都是以PAKE_AUTHOR_BOND事件+SESSION_BOND数据开始, 框架例程预先读取SESSION_BOND数据进行处理, 来决定是否走更新流程
    //    a. 业务例程不存在或者返回SESSION_STATUS_DEFAULT将走默认流程, 框架例程默认流程PAKE_AUTHOR_BONDACK返回外网端可以登陆信息
    //    b. 业务例程SESSION_STATUS_HANDLE, 表示业务流程已经处理并回复外网端, 保存现有状态不变(SESSION_STATUS_BOND)
    //    c. 业务例程SESSION_STATUS_LOGINACK, 表示业务流程已经完成验证, 需要框架例程回复外网端验证通过信息, 开始业务签证流程(自动模式)
    //    d. 业务例程SESSION_STATUS_LOGIN, 表示登陆流程由授权数据处理以后异步返回结果
    //    e. 业务例程SESSION_STATUS_LOGINWAIT, 表示登陆流程进入等待
    //
    // 2. [PAKE_AUTHOR_LOGIN]外网端由默认PAKE_AUTHOR_LOGIN流程来处理登陆过程
    //    a. 业务例程不存在或者返回SESSION_STATUS_DEFAULT走默认业务区流程, 默认业务区流程传递的SESSION_ID的自定义数据未初始化过
    //    b. 业务例程SESSION_STATUS_HANDLE, 表示业务流程已经处理并回复外网端, 保存现有状态不变(SESSION_STATUS_BOND)
    //    c. 业务例程SESSION_STATUS_LOGINACK, 表示业务流程已经完成验证, 需要框架例程回复外网端验证通过信息, 开始业务签证流程
    //    d. 业务例程SESSION_STATUS_LOGIN, 表示登陆流程由授权数据处理以后异步返回结果
    //    e. 业务例程SESSION_STATUS_LOGINWAIT, 表示登陆流程进入等待
    //
    // 3. 业务例程返回SESSION_STATUS_DEFAULT框架例程走默认流程, 自定义事件返回等同与SESSION_STATUS_HANDLE
    // 4. 业务例程返回SESSION_STATUS_HANDLE框架例程不会更新会话状态, 对连接不做任何处理
    //
    // 5. 业务区流程都由框架例程控制, 框架例程会通知业务例程对应事件[!!!暂时不支持]
    //    a. 业务例程不存在或者返回SESSION_STATUS_DEFAULT将走默认流程
    //    b. 业务例程返回对应状态表示业务例程已经处理, 只需要将状态改成下一个
    //    c. 业务例程返回SESSION_STATUS_LOGINACK重新开始流程(注意框架例程对业务区流程次数的控制, 超次数将关闭连接)
    //    d. 业务例程返回RET_ERROR关闭连接
    PAKE_AUTHOR_BOND,                          // CPAKBond
    PAKE_AUTHOR_LOGIN,                         // CPAKLogin
    PAKE_AUTHOR_LOGOUT,                        // CPAKLogout
    // 更新, 保留事件, 不可使用
    PAKE_AUTHOR_UPGRADE,                       // CPAKUpgrade
    // 获取业务管理服务器列表, 保留未支持事件, 不可使用
    PAKE_AUTHOR_LIST,                          // CPAKList
    // 手动选择业务管理服务器, 保留未支持事件, 不可使用
    PAKE_AUTHOR_SELECT,                        // CPAKSelect
    // 签证(自动选择业务管理的直接进入), 保留事件, 不可使用
    PAKE_AUTHOR_VISA,                          // CPAKVisa
    // 业务区登陆验证, 保留事件, 不可使用
    PAKE_AUTHOR_CHECK,                         // CPAKCheck
    // 业务区登陆完成, 保留事件, 不可使用
    PAKE_AUTHOR_COMPLETE,                      // CPAKComplete
    // 错误, 保留事件, 不可使用
    PAKE_AUTHOR_FAULT,                         // CPAKFault
    // 保留, 大于保留的为自定义事件
    PAKE_AUTHOR_RESERVED  = (PAKE_AUTHOR_BEGIN + 99),
    //--------------------------------------------
    PAKE_AUTHOR_MAINTAINACK = PAKE_AUTHOR_ACK, // CPAKMaintainAck
    PAKE_AUTHOR_BONDACK,                       // CPAKBondAck, 保留事件
    PAKE_AUTHOR_LOGINACK,                      // CPAKLoginAck, 保留事件
    PAKE_AUTHOR_LOGOUTACK,                     // CPAKLogoutAck, 保留事件
    PAKE_AUTHOR_UPGRADEACK,                    // CPAKUpgradeAck, 保留更新服务事件, 不可使用
    PAKE_AUTHOR_LISTACK,                       // CPAKListAck, 保留未支持事件, 不可使用
    PAKE_AUTHOR_SELECTACK,                     // CPAKSelectAck, 保留未支持事件, 不可使用
    PAKE_AUTHOR_VISAACK,                       // CPAKVisaAck, 保留事件
    PAKE_AUTHOR_CHECKACK,                      // CPAKCheckAck, 保留事件
    PAKE_AUTHOR_COMPLETEACK,                   // CPAKCompleteAck, 保留事件
    PAKE_AUTHOR_FAULTACK,                      // CPAKFaultAck, 保留事件
    // 保留, 大于保留的为自定义事件
    PAKE_AUTHOR_RESERVEDACK  = (PAKE_AUTHOR_ACK + 99),
};

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 维护时间
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_MAINTAIN, PAKT_AUTHOR>>               CPAKMaintain;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_MAINTAINACK, PAKT_AUTHORDB>>          CPAKMaintainAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_MAINTAIN, PAKT_AUTHOR>>            CNETMaintain;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_MAINTAINACK, PAKT_AUTHORDB>>       CNETMaintainAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 连接
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_BOND, PAKT_EXTERNAL_AUTHOR>>          CPAKBond;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_BONDACK, PAKT_AUTHOR>>                CPAKBondAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_BOND, PAKT_EXTERNAL_AUTHOR>>       CNETBond;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_BONDACK, PAKT_AUTHOR>>             CNETBondAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 登入
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_LOGIN, PAKT_EXTERNAL_AUTHOR>>         CPAKLogin;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_LOGINACK, PAKT_AUTHOR>>               CPAKLoginAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_LOGIN, PAKT_EXTERNAL_AUTHOR>>      CNETLogin;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_LOGINACK, PAKT_AUTHOR>>            CNETLoginAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 登出
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_LOGOUT, PAKT_EXTERNAL_AUTHOR>>        CPAKLogout;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_LOGOUTACK, PAKT_AUTHOR>>              CPAKLogoutAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_LOGOUT, PAKT_EXTERNAL_AUTHOR>>     CNETLogout;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_LOGOUTACK, PAKT_AUTHOR>>           CNETLogoutAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 更新
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_UPGRADE, PAKT_AUTHOR>>                CPAKUpgrade;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_UPGRADEACK, PAKT_GATE>>               CPAKUpgradeAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_UPGRADE, PAKT_AUTHOR>>             CNETUpgrade;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_UPGRADEACK, PAKT_GATE>>            CNETUpgradeAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 获取业务管理服务器列表
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_LIST, PAKT_EXTERNAL_AUTHOR>>          CPAKList;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_LISTACK, PAKT_AUTHOR>>                CPAKListAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_LIST, PAKT_EXTERNAL_AUTHOR>>       CNETList;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_LISTACK, PAKT_AUTHOR>>             CNETListAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 手动选择管理服务器
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_SELECT, PAKT_EXTERNAL_AUTHOR>>        CPAKSelect;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_SELECTACK, PAKT_AUTHOR>>              CPAKSelectAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_SELECT, PAKT_EXTERNAL_AUTHOR>>     CNETSelect;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_SELECTACK, PAKT_AUTHOR>>           CNETSelectAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 签证(自动选择业务管理的直接进入)
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_VISA, PAKT_AUTHOR>>                   CPAKVisa;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_VISAACK, PAKT_GATE>>                  CPAKVisaAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_VISA, PAKT_AUTHOR>>                CNETVisa;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_VISAACK, PAKT_GATE>>               CNETVisaAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 业务区登陆验证
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_CHECK, PAKT_AUTHOR>>                  CPAKCheck;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_CHECKACK, PAKT_GATE>>                 CPAKCheckAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_CHECK, PAKT_AUTHOR>>               CNETCheck;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_CHECKACK, PAKT_GATE>>              CNETCheckAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 业务区登陆完成
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_COMPLETE, PAKT_AUTHOR>>               CPAKComplete;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_COMPLETEACK, PAKT_GATE>>              CPAKCompleteAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_COMPLETE, PAKT_AUTHOR>>            CNETComplete;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_COMPLETEACK, PAKT_GATE>>           CNETCompleteAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
/// 错误
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_FAULT, PAKT_AUTHOR>>                  CPAKFault;
typedef CTPAKStreamT<CTPAKSessionBase<PAKE_AUTHOR_FAULTACK, PAKT_AUTHOR>>               CPAKFaultAck;

typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_FAULT, PAKT_AUTHOR>>               CNETFault;
typedef CTPAKNETStreamT<CTPAKSessionBase<PAKE_AUTHOR_FAULTACK, PAKT_AUTHOR>>            CNETFaultAck;

///////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "authorpacket.inl"

#endif // __AUTHOR_PACKET_H__
